#region Using

using System;
using System.Web;
using System.Collections.Generic;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using BlogEngine.Core;

#endregion

public partial class archive : BlogEngine.Core.Web.Controls.BlogBasePage
{
	/// <summary>
	/// Handles the Load event of the Page control.
	/// </summary>
	/// <param name="sender">The source of the event.</param>
	/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
  protected void Page_Load(object sender, EventArgs e)
  {
    if (!IsPostBack && !IsCallback)
    {
			CreateMenu();
      CreateArchive();
      AddTotals();
    }

    Page.Title = Server.HtmlEncode(Resources.labels.archive);
    base.AddMetaTag("description", Resources.labels.archive + " | " + BlogSettings.Instance.Name);
  }

	/// <summary>
	/// Creates the category top menu.
	/// </summary>
  private void CreateMenu()
  {
      foreach (Category cat in Category.LocalizedCategories)
    {
			AddCategoryToMenu(cat.Title);
    }
  }

	private void AddCategoryToMenu(string title)
	{
		HtmlAnchor a = new HtmlAnchor();
		a.InnerHtml = Server.HtmlEncode(title);
		a.HRef = "#" + Utils.RemoveIllegalCharacters(title);
		a.Attributes.Add("rel", "directory");

		HtmlGenericControl li = new HtmlGenericControl("li");
		li.Controls.Add(a);
		ulMenu.Controls.Add(li);
	}

	/// <summary>
	/// Sorts the categories.
	/// </summary>
	/// <param name="categories">The categories.</param>
  private SortedDictionary<string, KeyCulturePair<Guid>> SortCategories(Dictionary<Guid, string> categories)
  {
      SortedDictionary<string, KeyCulturePair<Guid>> dic = new SortedDictionary<string, KeyCulturePair<Guid>>();
    foreach (Category cat in Category.LocalizedCategories)
    {
      dic.Add(cat.Title, cat.Id);
    }

    return dic;
  }

  private void CreateArchive()
  {
      foreach (Category cat in Category.LocalizedCategories)
    {
      string name = cat.Title;
			List<Post> list = Post.GetPostsByCategory(cat.Id).FindAll(delegate(Post p) { return p.IsVisible && p.Id.Culture.CultureName == Utils.CurrentLanguage; });

			HtmlGenericControl h2 = CreateRowHeader(cat.Id.Key, name, list.Count);
      phArchive.Controls.Add(h2);

      HtmlTable table = CreateTable(name);
      foreach (Post post in list)
      {
				CreateTableRow(table, post);
      }

      phArchive.Controls.Add(table);
    }

    List<Post> noCatList = Post.LocalizedPosts.FindAll(delegate(Post p) { return p.Categories.Count == 0; });
		if (noCatList.Count > 0)
		{
			string name = Resources.labels.uncategorized;
			HtmlGenericControl h2 = CreateRowHeader(Guid.NewGuid(), name, noCatList.Count);
			phArchive.Controls.Add(h2);

			HtmlTable table = CreateTable(name);
			foreach (Post post in noCatList)
			{
				CreateTableRow(table, post);
			}

			phArchive.Controls.Add(table);

			AddCategoryToMenu(name);
		}
  }

	private static HtmlGenericControl CreateRowHeader(Guid id, string name, int count)
	{
		HtmlAnchor feed = new HtmlAnchor();
		feed.HRef = Utils.RelativeWebRoot + Utils.CurrentLanguage + "/category/syndication.axd?category=" + id.ToString();

		HtmlImage img = new HtmlImage();
		img.Src = Utils.RelativeWebRoot + "pics/rssbutton.gif";
		img.Alt = "RSS";

		feed.Controls.Add(img);

		HtmlGenericControl h2 = new HtmlGenericControl("h2");
		h2.Attributes["id"] = Utils.RemoveIllegalCharacters(name);
		h2.Controls.Add(feed);

		Control header = new LiteralControl(name + " (" + count + ")");
		h2.Controls.Add(header);
		return h2;
	}

	private static void CreateTableRow(HtmlTable table, Post post)
	{
		HtmlTableRow row = new HtmlTableRow();

		HtmlTableCell date = new HtmlTableCell();
		date.InnerHtml = post.DateCreated.ToString("yyyy-MM-dd");
		date.Attributes.Add("class", "date");
		row.Cells.Add(date);

		HtmlTableCell title = new HtmlTableCell();
		title.InnerHtml = string.Format("<a href=\"{0}\">{1}</a>", post.RelativeLink, post.Title);
		title.Attributes.Add("class", "title");
		row.Cells.Add(title);

		if (BlogSettings.Instance.IsCommentsEnabled)
		{
			HtmlTableCell comments = new HtmlTableCell();
			comments.InnerHtml = post.ApprovedComments.Count.ToString();
			comments.Attributes.Add("class", "comments");
			row.Cells.Add(comments);
		}

		if (BlogSettings.Instance.EnableRating)
		{
			HtmlTableCell rating = new HtmlTableCell();
            rating.InnerHtml = post.Raters == 0 ? Resources.labels.notRated : Math.Round(post.Rating, 1).ToString();
			rating.Attributes.Add("class", "rating");
			row.Cells.Add(rating);
		}

		table.Rows.Add(row);
	}

  private HtmlTable CreateTable(string name)
  {
    HtmlTable table = new HtmlTable();
    table.Attributes.Add("summary", name);

    HtmlTableRow header = new HtmlTableRow();

    HtmlTableCell date = new HtmlTableCell("th");
    date.InnerHtml = base.Translate("date");
    header.Cells.Add(date);

    HtmlTableCell title = new HtmlTableCell("th");
    title.InnerHtml = base.Translate("title");
    header.Cells.Add(title);

    if (BlogSettings.Instance.IsCommentsEnabled)
    {
      HtmlTableCell comments = new HtmlTableCell("th");
      comments.InnerHtml = base.Translate("comments");
      comments.Attributes.Add("class", "comments");
      header.Cells.Add(comments);
    }

    if (BlogSettings.Instance.EnableRating)
    {
      HtmlTableCell rating = new HtmlTableCell("th");
      rating.InnerHtml = base.Translate("rating");
      rating.Attributes.Add("class", "rating");
      header.Cells.Add(rating);
    }

    table.Rows.Add(header);

    return table;
  }

  private void AddTotals()
  {
    int comments = 0;
    int raters = 0;
    foreach (Post post in Post.LocalizedPosts)
    {
      comments += post.ApprovedComments.Count;
      raters += post.Raters;
    }

    ltPosts.Text = Post.LocalizedPosts.Count + " " + Resources.labels.posts.ToLowerInvariant();
    if (BlogSettings.Instance.IsCommentsEnabled)
      ltComments.Text = comments + " " + Resources.labels.comments.ToLowerInvariant();

    if (BlogSettings.Instance.EnableRating)
      ltRaters.Text = raters + " " + Resources.labels.raters.ToLowerInvariant();
  }
}
